package com.cencat.framework.security.model;

import lombok.Data;
import lombok.EqualsAndHashCode;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;

/**
 * 登录请求参数
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class LoginRequest {
    
    /**
     * 用户名
     */
    @NotBlank(message = "用户名不能为空")
    @Size(min = 3, max = 50, message = "用户名长度必须在3-50个字符之间")
    private String username;
    
    /**
     * 密码
     */
    @NotBlank(message = "密码不能为空")
    @Size(min = 6, max = 100, message = "密码长度必须在6-100个字符之间")
    private String password;
    
    /**
     * 验证码
     */
    private String captcha;
    
    /**
     * 验证码UUID
     */
    private String uuid;
    
    /**
     * 记住我
     */
    private Boolean rememberMe;
    
    /**
     * 租户ID
     */
    private Long tenantId;
    
    /**
     * 登录类型
     */
    private String loginType;
    
    /**
     * 设备类型
     */
    private String deviceType;
    
    /**
     * 客户端IP
     */
    private String clientIp;
    
    /**
     * 用户代理
     */
    private String userAgent;
    
    /**
     * 构造函数
     */
    public LoginRequest() {
    }
    
    /**
     * 构造函数
     */
    public LoginRequest(String username, String password) {
        this.username = username;
        this.password = password;
    }
    
    /**
     * 构造函数
     */
    public LoginRequest(String username, String password, Long tenantId) {
        this.username = username;
        this.password = password;
        this.tenantId = tenantId;
    }
    
    /**
     * 获取用户名（去除前后空格）
     */
    public String getUsername() {
        return username != null ? username.trim() : null;
    }
    
    /**
     * 获取密码（去除前后空格）
     */
    public String getPassword() {
        return password != null ? password.trim() : null;
    }
    
    /**
     * 验证参数有效性
     */
    public boolean isValid() {
        return username != null && !username.trim().isEmpty() &&
               password != null && !password.trim().isEmpty();
    }
    
    /**
     * 验证用户名格式
     */
    public boolean isValidUsername() {
        if (username == null || username.trim().isEmpty()) {
            return false;
        }
        
        // 用户名只能包含字母、数字、下划线、点号
        return username.matches("^[a-zA-Z0-9_.-]+$");
    }
    
    /**
     * 验证密码强度
     */
    public boolean isStrongPassword() {
        if (password == null || password.trim().isEmpty()) {
            return false;
        }
        
        // 密码必须包含字母和数字，长度至少6位
        return password.length() >= 6 && 
               password.matches(".*[a-zA-Z].*") && 
               password.matches(".*\\d.*");
    }
    
    /**
     * 清理敏感信息
     */
    public void clearSensitiveInfo() {
        this.password = null;
        this.captcha = null;
        this.uuid = null;
    }
    
    /**
     * 转换为字符串（不包含敏感信息）
     */
    @Override
    public String toString() {
        return "LoginRequest{" +
                "username='" + username + '\'' +
                ", captcha='" + (captcha != null ? "***" : null) + '\'' +
                ", uuid='" + uuid + '\'' +
                ", rememberMe=" + rememberMe +
                ", tenantId=" + tenantId +
                ", loginType='" + loginType + '\'' +
                ", deviceType='" + deviceType + '\'' +
                ", clientIp='" + clientIp + '\'' +
                '}';
    }
}